package com.sodimac.util.controls.adgFooter
{
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.Sprite;

import mx.controls.AdvancedDataGrid;
import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
import mx.controls.advancedDataGridClasses.AdvancedDataGridListData;
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;
import mx.core.mx_internal;
import mx.events.AdvancedDataGridEvent;
use namespace mx_internal;

public class AdvancedDataGridFooter extends UIComponent
{

	public function AdvancedDataGridFooter()
	{
		super();
	}

	protected var overlayFixed:Sprite;
	protected var overlayScrollable:Sprite;

	protected var dataGrid:AdvancedDataGrid;
	
	/**
	 *  create the actual border here
	 */
	override protected function createChildren():void
	{
		dataGrid = parent as AdvancedDataGrid;
		
		overlayFixed = new Sprite();
		addChild(overlayFixed);
		
		overlayScrollable = new Sprite();
		addChild(overlayScrollable);
		//
		dataGrid.addEventListener(AdvancedDataGridEvent.COLUMN_STRETCH,
			_handleColumnStretch);
	}
	private function _handleColumnStretch (e : AdvancedDataGridEvent) : void {
		_drawFixedColumns = false;
	}
	//you only need to draw the fixed columns on init and when the columns
	//are resized
	private var _drawFixedColumns : Boolean = false;
	/**
	 *	lay it out
	 */
	override protected function updateDisplayList(w:Number, h:Number):void
	{
		overlayScrollable.graphics.clear();
		if (!_drawFixedColumns){
    		overlayFixed.graphics.clear();
		}
      	var lockedColumns : int = dataGrid.lockedColumnCount;

		// destroy the old children - except the grid lines and the mask
		// if there is no mask, only keep the the grid lines (level 0),
		// if there is a mask, keep mask (level 0) and grid lines (level 1)
		var childrenToKeep : int = 2;
		if (_drawFixedColumns) childrenToKeep += lockedColumns;
		if (dataGrid.getStyle("horizontalScrollPolicy") != "off") {
			childrenToKeep ++;
			_updateMask (w, h);
		}
		while (numChildren > childrenToKeep) removeChildAt(childrenToKeep);
     
		// make new ones
		//var cols:Array = dataGrid.columns;
		
		//RG replace line for visible columns
		var orgcols:Array = dataGrid.columns;
		var cols:Array = new Array();
		for(var k : int = 0; k < orgcols.length; k++){
			if(AdvancedDataGridColumn(orgcols[k]).visible == true)
			{cols.push(orgcols[k]);}
		}		
		
		
		

      var lineCol:uint = dataGrid.getStyle("verticalGridLineColor");
      var vlines:Boolean = dataGrid.getStyle("verticalGridLines");
		overlayFixed.graphics.lineStyle(1, lineCol);
		overlayScrollable.graphics.lineStyle(1, lineCol);
    
		var xx:Number = 0;
		var yy:Number = 0;
		var i : int = 0;
		var col:AdvancedDataGridColumn;
		//draw the locked columns if there are any
		while (xx < w && i < lockedColumns)
		{
			col = cols[i++];
         if (!_drawFixedColumns) {
    			_drawColumn(col, overlayFixed, i, xx, yy, h);	
			}
			xx += col.width;
			
		}
		_drawFixedColumns = true;
		//draw the scrollable columns
		i = dataGrid.horizontalScrollPosition + lockedColumns;
		while (xx < w && i < cols.length )
		{
			col = cols[i++];
			_drawColumn(col, overlayScrollable, i, xx, yy, h);
			xx += col.width;
		}
		
      lineCol = dataGrid.getStyle("horizontalGridLineColor");
      if (dataGrid.getStyle("horizontalGridLines")) {
			overlayFixed.graphics.lineStyle(1, lineCol);
			overlayFixed.graphics.moveTo(0, yy);
			overlayFixed.graphics.lineTo(w, yy);
		}

		// draw separator at top of footer
      lineCol = dataGrid.getStyle("borderColor");
		overlayFixed.graphics.lineStyle(1, lineCol);
		overlayFixed.graphics.moveTo(0, 0);
		overlayFixed.graphics.lineTo(w, 0);

	}
	private function _drawColumn (col:AdvancedDataGridColumn,
	    drawSprite : Sprite, i : int, xx : Number, yy : Number, h : Number) : 
	    void 
	{
	    if (col is FooterAdvancedDataGridColumn) {
			var fdgc:FooterAdvancedDataGridColumn = col as 
			    FooterAdvancedDataGridColumn;
			fdgc.footerColumn.owner = fdgc.owner;
			var renderer:IListItemRenderer = (fdgc.footerColumn.itemRenderer) ? 
				fdgc.footerColumn.itemRenderer.newInstance() :
				dataGrid.itemRenderer.newInstance();
			renderer.styleName = fdgc.footerColumn;
			if (renderer is IDropInListItemRenderer) {
				IDropInListItemRenderer(renderer).listData = 
					new AdvancedDataGridListData(
					(fdgc.footerColumn.labelFunction != null) ? 
		         fdgc.footerColumn.labelFunction(col) 
					: fdgc.footerColumn.headerText, 
					fdgc.dataField, i - 1, null, dataGrid, -1);
			}
			renderer.data = fdgc;
			addChild(DisplayObject(renderer));
			renderer.x = xx;
			renderer.y = yy;
			renderer.setActualSize(col.width - 1, dataGrid.rowHeight);
			if (dataGrid.getStyle("verticalGridLines"))
			{
				drawSprite.graphics.moveTo(xx + col.width, yy);
				drawSprite.graphics.lineTo(xx + col.width, h);
			}
		}
	}
	private var _myMask : Sprite;
	/**
	 * Does two things : creates the mask if it's needed
	 * Updates the mask size based on the new size properties
	 */
	private function _updateMask (w : Number, h : Number) : void {
		//if the mask hasn't been created, create it
		if (_myMask == null) {
			_myMask = new Sprite();
			//need to add it at 1 because horizontal scroll policy could 
			//change at run time, and the removal of the text is based on
			//child index
			addChildAt(_myMask, 1);
			mask = _myMask;
		}
		var g : Graphics = _myMask.graphics;
		g.clear();
		g.beginFill(0xffffff, 0);
		g.drawRect(0, 0, w, h);
		g.endFill();
	}
}

}